题目
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
思路
这个题目是一个典型的回溯法问题,总的来说就是将可能的每种组合方式都列出来,挑选出其中满足条件的,如果不满足条件,就停止回溯,具体可看下面的示意:
n=3
(
(( ()
(() ((( ()( ())<不满足条件>
(()) (()( ()() ()((
约束条件为左括号数目大于右括号数目,左右括号数目小于n。
code
class Solution {
public:
void add_a(vector<string>&res,string kuohao,int left,int right,int n)
{
if(kuohao.size()==2*n)
{
res.push_back(kuohao);
return ;
}
if(left<n)
{
add_a(res,kuohao+'(',left+1,right,n);//不能写成++left,注意,因为下一个right并没有加上左括号。
}
if(right<left)//右括号小于左括号才是有效的组合
{
add_a(res,kuohao+')',left,right+1,n);
}
return ;
}
vector<string> generateParenthesis(int n) {
vector<string> res;
add_a(res,"",0,0,n);
return res;
}
};